#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<cstring>
#include<cstdlib>
#include<thread>


using namespace std;

string ToHex(pthread_t tid)
{
    char hex[64];
    snprintf(hex, sizeof(hex), "%p", tid);
    return hex;
}


void *ThreadRoutine(void *args)
{
    while(true)
    {
        cout<<"thread id: "<<ToHex(pthread_self())<<endl;
        sleep(1);
    }
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, ThreadRoutine, nullptr);

    pthread_join(tid, nullptr);
    return 0;
}




// void ThreadRun()
// {
//     while(true)
//     {
//         cout<<"I am a new thread for c++"<<endl;
//         sleep(1);
//     }
// }
 
// int main()
// {
//     thread t1(ThreadRun);

//     t1.join();

//     return 0;
// }




// class Request
// {
// public:
//     Request(int start, int end, const string &thread_name)
//     :_start(start),
//     _end(end),
//     _thread_name(thread_name)
//     {}

// public:
//     int _start;
//     int _end;
//     string _thread_name;
// };


// class Respnose
// {
// public:
//     Respnose(int result, int exit_code)
//     :_result(result),
//     _exit_code(exit_code)
//     {}
// public:
//     int _result;
//     int _exit_code;
// };


// void *SumCount(void *args)
// {
//     Request *rq = static_cast<Request*>(args);
//     Respnose *rp = new Respnose(0, 0);
//     for(int i = rq->_start; i<rq->_end;i++)
//     {
//         rp->_result += i;
//     }
//     return (void*)rp;
// }

// int main()
// {
//     pthread_t tid;
//     Request *rq = new Request(1, 100, "thread 1");

//     pthread_create(&tid, nullptr, SumCount, (void*)rq);

//     void *ret;
//     pthread_join(tid, &ret);

//     Respnose* rp = static_cast<Respnose*>(ret);
//     cout<<"rp -> result: "<<rp->_result<<", exitcode:"<<rp->_exit_code<<endl;
//     return 0;
// }




// int g_val = 0;

// void show(const string &name)
// {
//     cout<< name <<"say# hello thread, get a val:"<<g_val<<endl;
// }

// void *threadRun(void *args)
// {
//     int cnt = 5;
//     while(cnt--)
//     {
//         // std::cout<<"new thread: "<<getpid()<<std::endl;
//         show("new thread");
//         sleep(1);
//     }
//     // return (void *)1;
//     // exit(1);
//     pthread_exit((void*)1);
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr,threadRun, nullptr);

//     sleep(1);

//     pthread_cancel(tid);
//     // while(1)
//     // {
//     //     // std::cout<<"main thread: "<<getpid()<<std::endl;
//     //     show("main thread");
//     //     g_val++;
//     //     sleep(1);
//     // }
//     void* retval;
//     pthread_join(tid, &retval);

//     cout<<"ret: "<<(long long int)retval<<"  main thread  quit ..."<<endl;
//     return 0;
// }
